<?php
/**
 * Created by PhpStorm.
 * User: yys
 * Date: 2016/11/9
 * Time: 16:35
 * 压缩类
 */

namespace App\Services\Coupons;


use Illuminate\Support\Facades\Log;

class Zip
{
    /**
     * 获取文件列表
     * @param $dir
     * @return array
     */
   public function list_dir($dir){
        $result = array();
        if (is_dir($dir)){
            $file_dir = scandir($dir);
            foreach($file_dir as $file){
                if ($file == '.' || $file == '..'){
                    continue;
                }
                elseif (is_dir($dir.$file)){
                    $result = array_merge($result, self::list_dir($dir.$file.'/'));
                }
                else{
                    array_push($result, $dir.$file);
                }
            }
        }
        return $result;
    }

    /***
     * 添加文件到ZIP
     * @param $path
     * @param \ZipArchive $zip
     */
    private function addFileToZip($path,\ZipArchive $zip){
        $handler=opendir($path); //打开当前文件夹由$path指定。
        while(($filename=readdir($handler))!==false){
            if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’，不要对他们进行操作
                if(is_dir($path.DIRECTORY_SEPARATOR.$filename)){// 如果读取的某个对象是文件夹，则递归
                    self::addFileToZip($path.DIRECTORY_SEPARATOR.$filename, $zip);
                }else{ //将文件加入zip对象
                    $zip->addFile($path.DIRECTORY_SEPARATOR.$filename,$filename);
                }
            }
	}
        @closedir($path);
    }

    /***
     * 添加目录文件到压缩包中
     * @param $folder_path
     * @param string $save_folder_path
     * @return bool|string
     */
    public function addDirFileListToZip($folder_path,$save_folder_path='',$zip_name=''){
        try{
        $zip=new \ZipArchive();
        $save_folder_path=empty($save_folder_path)?public_path('images'.DIRECTORY_SEPARATOR.'zip'.DIRECTORY_SEPARATOR.'coupon'):$save_folder_path;
        $save_p_folder_path=dirname($save_folder_path);
        if(!file_exists($save_p_folder_path)){
            Log::info($save_p_folder_path);
            Log::info('目录不存在');
           return '';
        }
        @self::mkFolder($save_folder_path);
        if(empty($zip_name)||(sizeof(explode('.zip',$zip_name))<=1)) {
            $zip_name=date("YmdHis",time()).'.zip';
        }
        $zip_absolute_path= $save_folder_path.DIRECTORY_SEPARATOR.$zip_name;
        if($zip->open($zip_absolute_path, \ZipArchive::CREATE)=== TRUE){
            self::addFileToZip($folder_path, $zip); //调用方法，对要打包的根目录进行操作，并将ZipArchive的对象传递给方法
            $zip->close(); //关闭处理的zip文件
        }
        $path_arr=explode('public'.DIRECTORY_SEPARATOR,$zip_absolute_path);
        return (sizeof($path_arr)>1)?$path_arr[1]:$zip_absolute_path;
        }catch (\Exception $e){
            Log::info($e);
            return '';
        }
    }

    /**
     * 创建文件夹
     * @param $path
     */
    private function mkFolder($path)
    {
        try{
            if(!is_readable($path))
            {
                is_file($path) or mkdir($path,0766);
            }
            return true;
        }catch (\Exception $e){
            Log::info($e);
            return false;
        }
    }
}